context
今天同学提了一个需求,希望在 NavigationController
管理的控制器中,实现 Push
出的控制器是横屏,然后前一个控制器是竖屏的.
听到这么说, 很简单的想到使用代码控制器屏幕方向,(当然,需要首先在项目的 plist中允许屏幕的多个方向)
尝试
经过查找相关资料, 锁定了三个方法:
1 | -(BOOL)shouldAutorotate{ |
第一个方法: 允许自动旋转 ,返回 NO
第二个方法: 当前屏幕支持的方向,默认是
UIInterfaceOrientationMaskAll
,即支持所有在Xcode工程中标注的方向.在这返回竖屏,意为让其竖屏显示第三个方法: 当控制器推出方法是
Present
的时候,优先选择的方向,注意,这个只是优先选择的方向, 当显示完毕,用户继续旋转手机的时候,还是会自动根据用户手机方向进行变化的.
坑
方法准备完毕, 但是当用在同学的需求上时候,发现根本不起作用 .前一个控制器的状态,会影响后面的控制器.
后来查找相关资料, 虽然原因没找到, 但是大家都是遇到了这个问题.
个人猜想是,NavigationController是全局的容器,控制器本身并不能影响它的行为.
验证
继承系统的NavgationController
,添加以下方法:
1 | -(BOOL)shouldAutorotate{ |
旋屏屏幕, 发现在 Xcode中设置的屏幕方向没用了,现在只能是竖屏.
妥协
鉴于上面遇到的坑, 所以更改推出控制器的方式为 Present ,即让控制器脱离NavigationController
的管理 ,就像咱播放视频的时候, 视频自动横屏, 但是不是在Navigation的管理下.